package com.qdlc.p2p.common.util;

import java.io.IOException;
import java.security.SecureRandom;

import com.qdlc.p2p.common.util.code.BASE64Decoder;
import com.qdlc.p2p.common.util.code.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class Base64Util {
	/**
	 * 字符串Base64位加密
	 * @param str
	 * @return
	 */
	public static String base64Encode(String str) {
		BASE64Encoder encoder = new BASE64Encoder();
		String result = encoder.encode(str.getBytes());
		return result;
	}
	
	/**
	 * 字符串Base64位解密
	 * @param str
	 * @return
	 * @throws IOException
	 */
	public static String base64Decode(String str) {
		try {
			if (StringUtil.isNotBlank(str)) {
				BASE64Decoder decoder = new BASE64Decoder();
				String result = decoder.decodeStr(str);
				return result;
			} else {
				return null;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	// AES密钥
	public static String aesKey = "Xa1=~";
	/**
	 * AES加密
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static String aesEncoder(String str) throws Exception {
		byte[] byteRe = enCrypt(str,aesKey);
		//加密过的二进制数组转化成16进制的字符串
		return parseByte2HexStr(byteRe);
	}

	/**
	 * AES解密
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static String aesDecoder(String str) {
		byte[] encrytByte;
		//加密过的16进制的字符串转化成二进制数组
		encrytByte = parseHexStr2Byte(str);
		String retStr = "";
		try {
			retStr =  deCrypt(encrytByte,aesKey);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return retStr;
	}

	/**
	 * 加密函数
	 * @param content   加密的内容
	 * @param strKey    密钥
	 * @return          返回二进制字符数组
	 * @throws Exception
	 */
	public static byte[] enCrypt(String content,String strKey) throws Exception{
		KeyGenerator keygen;
		SecretKey desKey;
		Cipher c;
		byte[] cByte;
		String str = content;

		keygen = KeyGenerator.getInstance("AES");
		keygen.init(128, new SecureRandom(strKey.getBytes()));

		desKey = keygen.generateKey();
		c = Cipher.getInstance("AES");

		c.init(Cipher.ENCRYPT_MODE, desKey);

		cByte = c.doFinal(str.getBytes("UTF-8"));

		return cByte;
	}

	/** 解密函数
	 * @param src   加密过的二进制字符数组
	 * @param strKey  密钥
	 * @return
	 * @throws Exception
	 */
	public static String deCrypt (byte[] src,String strKey) throws Exception{
		KeyGenerator keygen;
		SecretKey desKey;
		Cipher c;
		byte[] cByte;

		keygen = KeyGenerator.getInstance("AES");
		keygen.init(128, new SecureRandom(strKey.getBytes()));

		desKey = keygen.generateKey();
		c = Cipher.getInstance("AES");

		c.init(Cipher.DECRYPT_MODE, desKey);


		cByte = c.doFinal(src);

		return new String(cByte,"UTF-8");
	}


	/**2进制转化成16进制
	 * @param buf
	 * @return
	 */
	public static String parseByte2HexStr(byte buf[]) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < buf.length; i++) {
			String hex = Integer.toHexString(buf[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			sb.append(hex.toUpperCase());
		}
		return sb.toString();
	}


	/**将16进制转换为二进制
	 * @param hexStr
	 * @return
	 */
	public static byte[] parseHexStr2Byte(String hexStr) {
		if (hexStr.length() < 1)
			return null;
		byte[] result = new byte[hexStr.length()/2];
		for (int i = 0;i< hexStr.length()/2; i++) {
			int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
			int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
			result[i] = (byte) (high * 16 + low);
		}
		return result;
	}

}
